package ch02_data.generics.classuse;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用泛型类，创建对象的时候需要指定具体的类型
 * ①异常类不能使用泛型；
 * ②要使用泛型都使用，不用都不用；
 * ③静态方法不能使用泛型；
 *
 * @author guod
 * @version 1.0
 * @since 1.8
 */
public class MainTest<T> {
    // 使用泛型的方式
    @Test
    public void useGeneric() {
        Sub<String> sub = new Sub<>();
        Sub01 sub01 = new Sub01();
        Sub02 sub02 = new Sub02(1);
        Sub03<Integer> sub03 = new Sub03<>(2);
        Sub04<String, Integer, Integer> sub04 = new Sub04<>();
    }

    // a = b;    // Error  结合内存模型考虑下为什么会报错？结合内存图分析
    // 反证法！假设b可以赋值给a
    // 假设 a = b成立；
    @Test
    public void a2b() {
        List<Integer> a = new ArrayList<>();
        List<String> b = new ArrayList<>();
        // a = b;
    }

    // 泛型在继承方面的体现
    // 类A是类B的父类，但是G<A> 和 G<B>二者是不具备父子类关系的，二者是并列关系。
    // 类A是类B的父类，A<T> 是 B<T>的父类
    @Test
    public void ext() {
        Object o = new Object();
        String s = new String();
        o = s;

        Object[] oa = new Object[10];
        String[] sa = new String[10];
        oa = sa;

        List<Object> lo = null;
        List<Integer> li = null;
        // 不具备父子关系
        // lo = li;
        show(lo);
        // show(li);
        showGen(li);
    }

    // 可用性比较差，引出通配符
    public void show(List<Object> o) {
    }

    public void showGen(List<?> o) {
        o.iterator();
    }


    // 泛型数组
    @Test
    public void arrT() {
        // T[] arr = new T[10];
        T[] arr = (T[]) new Object[10];
    }
}
